# 四大数据容器
# 列表List、元组Tuple、字典Dict、集合Set

# 列表
# 定义：list1 = [元素1,元素2,元素3,......]
# 特点：元素可以重复，元素的类型可以不唯一，有序，可变
list1 = [1, 2, 3, 4, 4, "a", "b", "c", 1.1, True]
print(list1, type(list1))

# 查找元素
# 通过下标获取元素
# 下标(index) 从零开始
print(list1[5])
print(list1.index(4))  # 传入一个值，返回该值第一次出现的位置

# 增加一个元素
list1.append('d')
print(list1)
list1.insert(5, 5.0)
print(list1)

# 修改元素
# 给定对应的下标直接进行修改
list1[5] = 'A'
print(list1)

# 删除元素
list1.pop()  # 弹出最后一个元素
print(list1)
list1.remove('A')  # 指定一个值进行移除
print(list1)
# list1.clear()  # 清空列表
# print(list1)

# 其他的操作
print(list1.count(4))  # 统计一个值出现的次数
list1.reverse()  # 反转
print(list1)

list2 = [2, 1, 5, 4, 3, 8, 6, 7, 9]
list2.sort(reverse=True)  # 排序 默认升序  reverse=True 倒序
print(list2)

list1.extend(list2)  # 相当于 list1 = list1 + list2
print(list1)

# 切片
# list3[起始位置:结束位置:步长]
# [起始位置,结束位置)
list3 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list3[1:5:1])  # [2,3,4,5]
print(list3[1:8:2])  # [2,4,6,8]
# 通过切片进行反转
# 负索引：从右往左第几个元素
print(list3[5])  # 6
print(list3[-4])  # 6

print(list3[::-1])

print(list3[-2:-6:-1])  # [8, 7, 6, 5]

# join 方法
list4 = ['1', '2', '3', '4']
sepStr = '|'
print(sepStr.join(list4))  # 1|2|3|4.....

# 元组Tuple
# 定义：tuple1 = (元素1,元素2,......,元素N)
# 特点：元素可以重复，元素的类型可以不唯一，有序，不可变
# "不可变" : 指向不变
tuple1 = (1, 2, 2, 2, 3, 3, 4, 5, 6, 'a', 'b', 1.1)
print(tuple1, type(tuple1))
print(tuple1[4])  # 3

# tuple1[4] = 33 # 不能对元组进行修改

# 也支持切片
print(tuple1[0:4:1])

# 注意：当元组只有一个元素的时候，初始化时记得加上逗号","
tuple2 = (1,)
print(tuple2, type(tuple2))

list1 = [1, 2, 3]
tuple3 = ('a', 'b', 'c', list1)
print(tuple3, type(tuple3))
tuple3[3][1] = 22
print(tuple3, type(tuple3))

# 字典Dict
# 定义：dict1 = {k1:v1,k2:v2,k3:v3,......}
# 特点：里面每个元素都是k:v键值对，适用于查找场景，key要求唯一，key必须是不可变类型，无序，可变的
# 不可变类型：基本数据类型、tuple
dict2 = {"k2": 'v222'}
dict1 = {'k1': 'v1', 'k2': 'v2'
    , 'k3': 'v3', 1: '1', 0: '0'
    , 1: 'True', 2: '2', 1.1: '1.1'}
print(dict1, type(dict1))

# 查询元素
# 通过key获取value
print(dict1['k1'])
print(dict1['k3'])
# print(dict1['k4'])  # key不存在即抛出异常
print(dict1.get('k4', '如果key不存在即返回'))  # 推荐使用这种方式

# 增加元素
dict1['k4'] = 'v4'
print(dict1)

# 修改元素
dict1['k4'] = 'vv4'
print(dict1)

# 删除元素
# pop 按照传入的key进行删除
dict1.pop(0)
dict1.pop(1)
dict1.pop(2)
print(dict1)

# 常用方法

print(dict1.keys())  # 获取所有的key
print(dict1.values())  # 获取所有的key

print(dict1)
dict1.clear()  # 清空

# 集合Set
# 定义：set1 = {元素1,元素2,元素3......}
# 特点：元素唯一，元素的类型可以不唯一，无序，可变
# 会自动对重复的元素进行去重
# 主要适用于数学上的集合运算（交集、并集、差集......）
set1 = {1, 2, 2, 3, 4, 'a', 'b', 'b', 'c', 1.1}
print(set1, type(set1))

# 查看容器的长度
print(list1)
print(len(list1))
